package work.chenxr.mogondb.repository;


import org.apache.commons.lang3.ObjectUtils;
import org.springframework.data.mongodb.repository.MongoRepository;
import work.chenxr.mogondb.entity.BaseEntity;

import java.time.LocalDateTime;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

/**
 * @Author Chenxr
 * @Date 2023/09/11
 * @Description 基础DAO接口
 */
public interface BaseRepository<T extends BaseEntity, ID> extends MongoRepository<T, ID> {
    /**
     * 保存或者更新
     * <p>根据主键ID先进行查询，当查询为空时，保存。反之，更新。</p>
     * <p>注意：若字段存在别名，则当前方法不适用，请自行实现。</p>
     *
     * @param t 对象
     */
    default T saveOrUpdate(T t) {
        LocalDateTime now = LocalDateTime.now();
        t.setUpdateTime(now);
        //TODO 用户需要接入权限系统后获取，例如：SecurityUser.getUserId()
        t.setUpdater("userId");
        if (ObjectUtils.isEmpty(t.getId()) || this.findById((ID) t.getId()).isEmpty()) {
            t.setDeleted(0);
            t.setCreateTime(now);
            //TODO 用户需要接入权限系统后获取，例如：SecurityUser.getUserId()
            t.setCreator("userId");
            return this.insert(t);
        }
        // 更新
        return this.save(t);
    }

    /**
     * 根据ID逻辑删除
     */
    default void logicById(ID id) {
        this.logicByIds(Collections.singleton(id));
    }

    /**
     * 根据ID集合逻辑删除
     */
    default void logicByIds(Collection<ID> ids) {
        List<T> list = this.findAllById(ids);
        if (ObjectUtils.isNotEmpty(list)) {
            LocalDateTime now = LocalDateTime.now();
            //TODO 用户需要接入权限系统后获取，例如：SecurityUser.getUserId()
            String userId = "userId";
            list.forEach(t -> {
                t.setDeleted(1);
                t.setUpdateTime(now);
                t.setUpdater(userId);
            });
            this.saveAll(list);
        }
    }

    /**
     * 查询所有未逻辑删除的集合
     */
    List<T> findAllByDeletedIsFalse();
}
